diff --git a/discovery/kubernetes/pod.go b/discovery/kubernetes/pod.go
index 732cf52ad..3080f013b 100644
--- a/discovery/kubernetes/pod.go
+++ b/discovery/kubernetes/pod.go
@@ -299,6 +299,7 @@ func (p *Pod) buildPod(pod *apiv1.Pod) *targetgroup.Group {
 			// The user has to add a port manually.
 			tg.Targets = append(tg.Targets, model.LabelSet{
 				model.AddressLabel:     lv(pod.Status.PodIP),
+				"__sample_limit__":     lv(""),
 				podContainerNameLabel:  lv(c.Name),
 				podContainerIDLabel:    lv(cID),
 				podContainerImageLabel: lv(c.Image),
@@ -313,6 +314,7 @@ func (p *Pod) buildPod(pod *apiv1.Pod) *targetgroup.Group {

 			tg.Targets = append(tg.Targets, model.LabelSet{
 				model.AddressLabel:            lv(addr),
+				"__sample_limit__":            lv(""),
 				podContainerNameLabel:         lv(c.Name),
 				podContainerIDLabel:           lv(cID),
 				podContainerImageLabel:        lv(c.Image),
diff --git a/discovery/kubernetes/service.go b/discovery/kubernetes/service.go
index 40e17679e..32e3ea46c 100644
--- a/discovery/kubernetes/service.go
+++ b/discovery/kubernetes/service.go
@@ -193,6 +193,7 @@ func (s *Service) buildService(svc *apiv1.Service) *targetgroup.Group {

 		labelSet := model.LabelSet{
 			model.AddressLabel:       lv(addr),
+			"__sample_limit__":       lv(""),
 			servicePortNameLabel:     lv(port.Name),
 			servicePortNumberLabel:   lv(strconv.FormatInt(int64(port.Port), 10)),
 			servicePortProtocolLabel: lv(string(port.Protocol)),
diff --git a/scrape/scrape.go b/scrape/scrape.go
index 8c4cc51e7..e7bff4dcb 100644
--- a/scrape/scrape.go
+++ b/scrape/scrape.go
@@ -314,6 +314,11 @@ func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, offsetSeed
 		}
 		opts.target.SetMetadataStore(cache)

+		limit := opts.target.SampleLimit()
+		if limit == 0 {
+			limit = opts.sampleLimit
+		}
+
 		return newScrapeLoop(
 			ctx,
 			opts.scraper,
@@ -327,7 +332,7 @@ func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, offsetSeed
 			cache,
 			offsetSeed,
 			opts.honorTimestamps,
-			opts.sampleLimit,
+			limit,
 			opts.bucketLimit,
 			opts.labelLimits,
 			opts.interval,
diff --git a/scrape/target.go b/scrape/target.go
index a655e8541..fbd437e01 100644
--- a/scrape/target.go
+++ b/scrape/target.go
@@ -18,6 +18,7 @@ import (
 	"hash/fnv"
 	"net"
 	"net/url"
+	"strconv"
 	"strings"
 	"sync"
 	"time"
@@ -546,3 +547,15 @@ func TargetsFromGroup(tg *targetgroup.Group, cfg *config.ScrapeConfig, noDefault
 	}
 	return targets, failures
 }
+
+func (t *Target) SampleLimit() int {
+	limit := t.labels.Get("__sample_limit__")
+	if limit == "" {
+		return 0
+	}
+	convertedLimit, err := strconv.Atoi(limit)
+	if err != nil {
+		return 0
+	}
+	return convertedLimit
+}
